﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using Blank.Http.Enumrator;

namespace Blank.Http.Models
{
    /// <summary>
    /// 调用官方API返回结果
    /// </summary>
    public class ServiceResult<T>
    {

        /// <summary>
        /// 如果没有出现异常，则为正常结果集合。出现异常则有对应的异常结果。
        /// </summary>
        public T Results { get; set; }
        /// <summary>
        /// 
        /// </summary>
        //public List<Error> Errors { get; set; }
        /// <summary>
        /// 服务端返回的结果集
        /// </summary>
        public HttpResult HttpResult { get; set; }
        /// <summary>
        /// 有关API服务响应状态码，官方描述！
        /// <para>200 OK 成功</para>
        /// <para>302 Found</para>
        /// <para>304 Not Modified 没有新数据可以返回</para>
        /// <para>400 BadRequest 请求无效。返回的错误信息中会包含错误原因。如果超过接口请求次数限制 也会返回这个状态码</para>
        /// <para>401 Unauthorized</para>
        /// <para>402 Request Failed 参数正确但是请求失败</para>
        /// <para>403 Forbidden 请求正确 但是服务器拒绝响应。返回的错误信息中会包含错误原因。</para>
        /// <para>404 NotFound URI请求无效或者请求的资源比如用户信息不存在。</para>
        /// <para>420 Enhance Your Calm 超过请求次数限制</para>
        /// <para>422 Unprocessable 验证错误。</para>
        /// <para>429 Too Many Requests 用户在给定的时间内发送过多请求。与接口访问频次权限相关。</para>
        /// <para>500 InternalServerError 未知错误。请联系我们的$3,工程师进行调查。</para>
        /// <para>503 Service Unavailable 体育博彩服务器超负荷。请稍后再试。</para>
        /// <para>504 Gateway Timeout 由于在堆栈内出现一些故障体育博彩服务器无法响应请求。请稍后再试。</para>
        /// </summary>
        //public string ResponseDescription
        //{
        //    get
        //    {
        //        if (this.ServerResult == null)
        //            throw new ArgumentNullException("ServerResult");
        //        StringBuilder description = new StringBuilder(this.ServerResult.StatusCode.ToString());
        //        switch ((int)this.ServerResult.StatusCode)
        //        {
        //            #region MyRegion
        //            case 200:
        //                description.Append(",成功！");
        //                break;
        //            case 302:
        //            case 401:
        //                break;
        //            case 304:
        //                description.Append(",没有新数据可以返回！");
        //                break;
        //            case 400:
        //                description.Append(",请求无效。返回的错误信息中会包含错误原因。如果超过接口请求次数限制 也会返回这个状态码。");
        //                break;
        //            case 402:
        //                description.Append(",参数正确但是请求失败");
        //                break;
        //            case 403:
        //                description.Append(",请求正确 但是服务器拒绝响应。返回的错误信息中会包含错误原因。");
        //                break;
        //            case 404:
        //                description.Append(",URI请求无效或者请求的资源比如用户信息不存在。");
        //                break;
        //            case 420:
        //                description.Append(",超过请求次数限制");
        //                break;
        //            case 422:
        //                description.Append(",验证错误。");
        //                break;
        //            case 429:
        //                description.Append(",用户在给定的时间内发送过多请求。与接口访问频次权限相关。");
        //                break;
        //            case 500:
        //                description.Append(",未知错误。请联系官服网站技术人员！");
        //                break;
        //            case 503:
        //                description.Append(",体育博彩服务器超负荷。请稍后再试。");
        //                break;
        //            case 504:
        //                description.Append(",由于在堆栈内出现一些故障体育博彩服务器无法响应请求。请稍后再试");
        //                break;
        //            default:
        //                description.Append(",未知错误!");
        //                break;
        //            #endregion
        //        }

        //        return description.ToString();
        //    }
        //}
        /// <summary>
        /// 错误是否产生
        /// </summary>
        public bool ErrorCause
        {
            get
            {
                if (this.HttpResult == null)
                    throw new ArgumentNullException("ServerResult");
                if (this.HttpResult.StatusCode == HttpStatusCode.OK 
                    //&& this.Errors == null 
                    && this.Exception == null)
                    return false;
                return true;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public Exception Exception { get; set; }
    }
}
